package com.xiweicheng.test.springboot.ws;

import java.security.Principal;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;

import lombok.extern.slf4j.Slf4j;

@Controller
@Slf4j
public class WsController {

	// 通过simpMessagingTemplate向浏览器发送消息
	@Autowired
	SimpMessagingTemplate simpMessagingTemplate;

	@MessageMapping("/chat")
	// 在springmvc中,可以直接在参数中获得principal,pinciple中包含当前用户信息
	public void handleChat(Principal principal, String msg) {

		if ("james".equals(principal.getName())) {//硬编码,对用户姓名进行判断
			//向用户发送消息,第一个参数:接收消息的用户,第二个参数:浏览器订阅地址,第三个参数:消息
			simpMessagingTemplate.convertAndSendToUser("curry", "/queue/notifications",
					principal.getName() + "-send: " + msg);
		} else {
			simpMessagingTemplate.convertAndSendToUser("james", "/queue/notifications",
					principal.getName() + "-send: " + msg);
		}
	}

	@MessageMapping("/welcome") // 当浏览器向服务端发送请求时,通过@MessageMapping映射/welcome这个地址,类似于@ResponseMapping
	@SendTo("/topic/getResponse") // 当服务器有消息时,会对订阅了@SendTo中的路径的浏览器发送消息
	public Response say(Message message) {
		try {
			//睡眠3秒
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return new Response("welcome," + message.getName() + "!");
	}

	/** 
	 * 发送消息 
	     *@MessageMapping是stomp提供发送消息的注解，类似@RequestMappeing 
	     * @param json json文本  
	     */
	@MessageMapping("/sendChatMsg")
	public void sendChatMsg(String json) throws Exception {
		if (StringUtils.isNotBlank(json)) {
			//json转换为实体，JsonUtils代码不给了，自己到网上拿一个    
			//              MsgWeixin po = JsonUtil.toObject(json, MsgWeixin.class);  
			/*浏览器用户通讯订阅的地址.拼接聊天对话id，准确将消息发到某一个聊天中  
			 *防止一个对话能接收多个联系人的消息 
			 */
			//              String chatAddress = "/queue/contactMessage" + po.getChatId();  
			//保存到数据库  
			//                msgWeixinService .insert();           

			//若缓存已不存在accountId，证明是连接断开，不推送消息  
			//             String cacheName = Constants.WEBSOCKET_ACCOUNT;  
			//             if (!CacheManager.containsKey(cacheName,cacheName+po.getToUserId()) ){  
			//               return ;  
			//             }  
			//            //向用户发送消息,第一个参数是接收人、第二个参数是浏览器订阅的地址，第三个是消息本身  
			//             simpMessagingTemplate.convertAndSendToUser(po.getFromUserId(),chatAddress,po.getContent());  
		}
	}

	//处理发送消息的错误,json是sendChatMsg方法的参数，传递到这里  
	@MessageExceptionHandler
	public void handleExceptions(Exception e, String json) {
		log.error("Error handling message: " + e.getMessage());
		//		MsgWeixin po = JsonUtil.toObject(json, MsgWeixin.class);
		//		String errorJson = ResultUtil.getError(ResultCode.UN_KNOW_EXCEPTION);
		//		//把错误信息发回给发送人  
		//		simpMessagingTemplate.convertAndSendToUser(po.getFromUserId(), "/queue/contactErrors" + po.getChatId(),
		//				errorJson);
	}
}
